package com.zhoug.android.common.utils;

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.ViewConfiguration;


import androidx.annotation.AttrRes;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.ContextCompat;

/**
 * 描述：资源工具
 * zhougan
 * 2019/3/24
 **/
public class ResourceUtils {
    private static final String TAG = ">>>ResourceUtils";



    public static DisplayMetrics getDisplayMetrics(@NonNull Context context){
        return context.getResources().getDisplayMetrics();
    }

    /**
     * 将px值转换为dip或dp值，保证尺寸大小不变
     *
     * @param pxValue （DisplayMetrics类中属性density）
     * @return
     */
    public static int pxTodp(@NonNull Context context,float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将dip或dp值转换为px值，保证尺寸大小不变
     *
     * @param dipValue （DisplayMetrics类中属性density）
     * @return
     */
    public static int dpTopx(@NonNull Context context,float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    /**
     * 1dp对应的px值
     * @return
     */
    public static int PxPerDp(@NonNull Context context ) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (scale + 0.5f);
    }


    /**
     * 将px值转换为sp值，保证文字大小不变
     *
     * @param pxValue （DisplayMetrics类中属性scaledDensity）
     * @return
     */
    public static int pxToSp(@NonNull Context context,float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值，保证文字大小不变
     *
     * @param spValue （DisplayMetrics类中属性scaledDensity）
     * @return
     */
    public static int spTopx(@NonNull Context context,float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }


    /**
     * 根据资源名字获取资源的id
     *
     * @param resType 资源类型{eg:id,string,drawable}
     * @param resName 资源名字
     * @return
     */
    public static int getResIdByName(@NonNull Context context,String resType, String resName) {
        try {
            return context.getResources().getIdentifier(resName, resType, context.getPackageName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取资源文件的id
     *
     * @param resName eg: android:id="@+id/btn1"中的btn1
     * @return
     */
    public static int getIdId(@NonNull Context context,String resName) {
        //getIdentifier参数:资源的名称,资源的类型(drawable,string等),包名
        return getResIdByName(context,"id", resName);
    }

    /**
     * 获取资源文件中string的id
     *
     * @param resName eg: <string name="app_name">AndroidCommon</string>中的app_name
     * @return
     */
    public static int getStringId(@NonNull Context context,String resName) {
        return getResIdByName(context,"string", resName);
    }


    /**
     * 获取资源文件drawable的id
     *
     * @param resName eg:ic_launcher_background   /drawable/ic_launcher_background.xml
     * @return
     */
    public static int getDrawableId(@NonNull Context context,String resName) {
        return getResIdByName(context,"drawable", resName);

    }


    /**
     * 获取资源文件layout的id
     *
     * @param resName eg: activity_main    /layout/activity_main.xml
     * @return
     */
    public static int getLayoutId(@NonNull Context context,String resName) {
        return getResIdByName(context,"layout", resName);
    }


    /**
     * 获取资源文件style的id
     *
     * @param resName eg:AppTheme  <style name="AppTheme"></style>
     * @return
     */
    public static int getStyleId(@NonNull Context context,String resName) {
        return getResIdByName(context,"style", resName);

    }

    /**
     * 获取资源文件color的id
     *
     * @param resName eg:colorPrimary    <color name="colorPrimary">#008577</color>
     * @return
     */
    public static int getColorId(@NonNull Context context,String resName) {
        return getResIdByName(context,"color", resName);

    }

    /**
     * 获取资源文件dimen的id
     *
     * @param resName eg:zxc     <dimen name="zxc">12dp</dimen>
     * @return
     */
    public static int getDimenId(@NonNull Context context,String resName) {
        return getResIdByName(context,"dimen", resName);

    }

    /**
     * 获取资源文件ainm的id
     *
     * @param resName eg:test  /anim/test.xml
     * @return
     */
    public static int getAnimId(@NonNull Context context,String resName) {
        return getResIdByName(context,"anim", resName);

    }

    /**
     * 获取资源文件menu的id
     *
     * @param resName eg:menu1   /menu/menu1.xml
     * @return
     */
    public static int getMenuId(@NonNull Context context,String resName) {
        return getResIdByName(context,"menu", resName);

    }

    /**
     * 获取资源文件xml的id
     *
     * @param resName eg:file_paths   /xml/file_paths.xml
     * @return
     */
    public static int getXmlId(@NonNull Context context,String resName) {
        return getResIdByName(context,"xml", resName);

    }

    /**
     * 获取颜色 {@link ContextCompat}
     *
     * @param id
     * @return
     */
    public static int getColor(@NonNull Context context,@ColorRes int id) {
        return ContextCompat.getColor(context,id);
    }

    /**
     * 获取主题中属性的值
     *
     * @param attrResId 属性id R.attr.id
     * @return
     */
    @Deprecated
    public static int getAttrValue(@NonNull Context context,@StyleRes int styleResId, @AttrRes int attrResId) {
        TypedValue typedValue = new TypedValue();
        int dimen = 0;
        boolean b = context.getTheme().resolveAttribute(attrResId, typedValue, true);
        if (b) {
            dimen = TypedValue.complexToDimensionPixelSize(typedValue.data, context.getResources().getDisplayMetrics());
            LogUtils.d(TAG, "getAttrValue:方式1:dimen=" + dimen);
        }
        if (dimen == 0) {
            TypedArray typedArray = context.getTheme().obtainStyledAttributes(styleResId, new int[]{attrResId});
            if (typedArray.length() == 1) {
                dimen = typedArray.getDimensionPixelOffset(0, 0);
                LogUtils.d(TAG, "getAttrValue:方式2:dimen=" + dimen);
                typedArray.recycle();
            }

        }
        return dimen;
    }



    /**
     * 系统所认为的最小滑动距离TouchSlop
     * @return
     */
    public static int getTouchSlop(@NonNull Context context ) {
        return ViewConfiguration.get(context).getScaledTouchSlop();
    }

    //////////////////////////
    private static TypedValue typedValue;

    private static TypedValue _getTypedValue() {
        if(typedValue==null){
            typedValue=new TypedValue();
        }
        return typedValue;
    }

    public static float getAttrFloatValue(Context context, int attr) {
        return getAttrFloatValue(context.getTheme(), attr);
    }

    /**
     * 获取Theme中指定属性的值:float
     * @param theme {@link Resources.Theme}
     * @param attr eg:R.attr.height
     * @return value
     */
    public static float getAttrFloatValue(Resources.Theme theme, int attr) {
        if (!theme.resolveAttribute(attr, _getTypedValue(), true)) {
            return 0;
        }
        return _getTypedValue().getFloat();
    }

    public static int getAttrColor(Context context, int attrRes) {
        return getAttrColor(context.getTheme(), attrRes);
    }

    /**
     * 获取Theme中指定属性的值:color
     * @param theme
     * @param attr
     * @return
     */
    public static int getAttrColor(Resources.Theme theme, int attr) {
        if (!theme.resolveAttribute(attr, _getTypedValue(), true)) {
            return 0;
        }
        //如果获得的值的类型还是属性id,则继续用id查找
        if (_getTypedValue().type == TypedValue.TYPE_ATTRIBUTE) {
            return getAttrColor(theme, _getTypedValue().data);
        }
        return _getTypedValue().data;
    }

    @Nullable
    public static ColorStateList getAttrColorStateList(Context context, int attrRes) {
        return getAttrColorStateList(context, context.getTheme(), attrRes);
    }

    /**
     * 获取Theme中指定属性的值:ColorStateList
     * @param context
     * @param theme
     * @param attr
     * @return
     */
    @Nullable
    public static ColorStateList getAttrColorStateList(Context context, Resources.Theme theme, int attr) {
        if (attr == 0) {
            return null;
        }
        if (!theme.resolveAttribute(attr, _getTypedValue(), true)) {
            return null;
        }
        if (_getTypedValue().type >= TypedValue.TYPE_FIRST_COLOR_INT
                && _getTypedValue().type <= TypedValue.TYPE_LAST_COLOR_INT) {
            return ColorStateList.valueOf(_getTypedValue().data);
        }
        if (_getTypedValue().type == TypedValue.TYPE_ATTRIBUTE) {
            return getAttrColorStateList(context, theme, _getTypedValue().data);
        }
        if (_getTypedValue().resourceId == 0) {
            return null;
        }
        return ContextCompat.getColorStateList(context, _getTypedValue().resourceId);
    }

    @Nullable
    public static Drawable getAttrDrawable(Context context, int attr) {
        return getAttrDrawable(context, context.getTheme(), attr);
    }

    /**
     * 获取Theme中指定属性的值:Drawable
     * @param context
     * @param theme
     * @param attr
     * @return
     */
    @Nullable
    public static Drawable getAttrDrawable(Context context, Resources.Theme theme, int attr) {
        if (attr == 0) {
            return null;
        }

        if (!theme.resolveAttribute(attr, _getTypedValue(), true)) {
            return null;
        }
        if (_getTypedValue().type >= TypedValue.TYPE_FIRST_COLOR_INT
                && _getTypedValue().type <= TypedValue.TYPE_LAST_COLOR_INT) {
            return new ColorDrawable(_getTypedValue().data);
        }
        if (_getTypedValue().type == TypedValue.TYPE_ATTRIBUTE) {
            return getAttrDrawable(context, theme, _getTypedValue().data);
        }

        if (_getTypedValue().resourceId != 0) {
            return AppCompatResources.getDrawable(context, _getTypedValue().resourceId);
        }
        return null;
    }

    @Nullable
    public static Drawable getAttrDrawable(Context context, TypedArray typedArray, int index) {
        TypedValue value = typedArray.peekValue(index);
        if (value != null) {
            if (value.type != TypedValue.TYPE_ATTRIBUTE && value.resourceId != 0) {
                return AppCompatResources.getDrawable(context, value.resourceId);
            }
        }
        return null;
    }

    /**
     *  获取Theme中指定属性的值:Dimen
     * @param context
     * @param attrRes
     * @return
     */
    public static int getAttrDimen(Context context, int attrRes) {
        if (!context.getTheme().resolveAttribute(attrRes, _getTypedValue(), true)) {
            return 0;
        }
        return TypedValue.complexToDimensionPixelSize(_getTypedValue().data, context.getResources().getDisplayMetrics());
    }

    /**
     *  获取Theme中指定属性的值:String
     * @param context
     * @param attrRes
     * @return
     */
    @Nullable
    public static String getAttrString(Context context, int attrRes) {
        if (!context.getTheme().resolveAttribute(attrRes, _getTypedValue(), true)) {
            return null;
        }
        CharSequence str = _getTypedValue().string;
        return str == null ? null : str.toString();
    }

    /**
     * 获取自定义属性的值 String
     *
     * @param theme
     * @param id
     * @return
     */
    public static String getAttrValueString(Resources.Theme theme, @AttrRes int id) {
        TypedValue typedValue1 = new TypedValue();
        theme.resolveAttribute(id, typedValue1, true);
        CharSequence str = typedValue1.string;
        return str == null ? null : str.toString();
    }

    /**
     *  获取Theme中指定属性的值:int
     * @param context
     * @param attrRes
     * @return
     */
    public static int getAttrInt(Context context, int attrRes) {
        context.getTheme().resolveAttribute(attrRes, _getTypedValue(), true);
        return _getTypedValue().data;
    }

    /**
     *  获取Theme中指定属性的值:boolean
     * @param theme
     * @param id
     * @return
     */
    public static boolean getAttrBoolean(Resources.Theme theme, @AttrRes int id) {
        theme.resolveAttribute(id, _getTypedValue(), true);
        return _getTypedValue().data ==-1;
    }

    public static boolean getAttrBoolean(Context context, @AttrRes int id) {
        return getAttrBoolean(context.getTheme(),id);
    }

    /**
     * 获取自定义属性的值 int
     * @param theme
     * @param id
     * @return
     */
    public static int getAttrValueInt(Resources.Theme theme, @AttrRes int id) {
        TypedValue typedValue = new TypedValue();
        theme.resolveAttribute(id, typedValue, true);
        return typedValue.data;
    }


}
